#!/usr/bin/python
# -*- coding:utf-8 -*-

#Importamos las librerías que vamos a usar
import pygame
import Image
from pygame.locals import *
import opencv
from opencv import adaptors
from opencv import highgui,cv

from os import mkdir
from os.path import join

dbpath = "./"


# Función utilizada para detectar un patrón
def detectar(img,cascada,almacen,x,y,escala):
    cv.cvClearMemStorage(almacen)
    return cv.cvHaarDetectObjects(
                                   img,
                                   cascada,
                                   almacen,
                                   escala,
                                   2,
                                   0,
                                   cv.cvSize(x, y))


def creacarpeta(nomcarpeta):
    mkdir( join( dbpath, nomcarpeta ) )

def main(args):

    creacarpeta(args)

    # Este objeto representa la cámara
    camara = highgui.cvCreateCameraCapture(0)
    fps = 30

    # Inicializa el módulo pygame
    pygame.init()

    # Crea una ventana de 320x240 pixeles
    ventana = pygame.display.set_mode((320,240))

    pygame.display.set_caption(
        "Proyecto de Investigación: Reconocimiento Facial")
    pantalla = pygame.display.get_surface()

    # Definiendo cuales son los archivos que describen los patrones
    # que se quieren reconocer
    nombre_cascada ='./haarcascades/haarcascade_frontalface_alt.xml'

    # almacen es una especie de buffer (persistente)
    almacen = cv.cvCreateMemStorage(0)

    cascada = cv.cvLoadHaarClassifierCascade(nombre_cascada, cv.cvSize(14,14))

    escala = 2
    inx=0
    while inx < 300: # Entra en un ciclo infinito
        try:
            msg = '[%03d] Capturando cuadro' % inx
            print '%-72s' % msg,
            img1 = highgui.cvQueryFrame(camara)
            print '[HECHO]'

            # Inicia la detección del rostro
            # Aquí hace una detección "general", es como si
            # el script dijera: "¡Hey, encontré algo!"
            msg = '[%03d] Detectando caras' % inx
            print '%-72s' % msg,
            caras = detectar(img1,cascada,almacen,50,50,escala)
            print '[HECHO]'


            if caras.total != 0:
                print '[%03d] Se encontraron' % inx , caras.total, 'caras'
                cara = caras[0]
                cv.cvRectangle(img1,
                cv.cvPoint( int(cara.x), int(cara.y)),
                cv.cvPoint(int(cara.x + cara.width), int(cara.y + cara.height)),
                cv.CV_RGB(255,0,0), 3, 8, 0)

                # Encontrando la región de la imagen en que se detectó la cara
                cara_x1 = int(cara.x + 2)/2
                cara_y1 = int(cara.y + 2)/2
                cara_x2 = int(cara.x + cara.width - 2)/2
                cara_y2 = int(cara.y + cara.height - 2)/2
            else:
                print '[%03d] No se reconicieron rostros' % inx

            img = adaptors.Ipl2PIL(img1).resize((320,240))

            #Si se detectó la cara entonces se puede guardar la imagen,
            # con las indicaciones de los lugares en donde se encontraron los patrones.

            if caras.total:
                #Seleccionar la región del rostro
                box= (cara_x1, cara_y1 , cara_x2, cara_y2 )
                imag= img.crop(box)

                #Escalar la imagen
                imag = imag.resize((70, 75), Image.ANTIALIAS)

                #Covertir la imagen a escala de grises
                imag = imag.convert ("L")

                #Guardar la imagen
                imag.save(args+'/img'+str(inx)+'.pgm')
                inx+=1

            # Desplegando la imagen resultante
            pgimg = pygame.image.frombuffer(img.tostring(), img.size, img.mode)
            pantalla.blit(pgimg, (0,0))
            pygame.display.flip()
            pygame.time.delay(int(1000 * 1.0/fps))

        except Exception, e:
            print 'Ocurrio un error', e
            print e.message


if __name__ == '__main__':

    main('./nuevabd')




